home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Audio, Video & Photo / Audacity 1.3.5 / audacity-win-unicode-1.3.5.exe / {app} / Plug-Ins / vocoder.ny < prev   
Lisp/Scheme  |  2007-10-09  |  5KB  |  114 lines

  1. ;nyquist plug-in
  2. ;version 3
  3. ;type process
  4. ;name "Vocoder"
  5. ;action "Processing Vocoder..."
  6. ;info "by Edgar-RFT and David R. Sky\nReleased under terms of the GNU General Public License version 2\nNote: Vocoder works only on * stereo * tracks. Setting channel processing\nto '1 (right channel)' processes only the right channel of your stereo track."
  7.  
  8. ;control dst "Distance: [1 to 120, default = 20]" real "" 20 1 120
  9. ;control mst "Channel processing" choice " 2 (both channels), 1 (right channel)" 0
  10. ;control bands "Number of vocoder bands" int "" 40 10 240
  11. ;control track-vl "Amplitude of original audio [percent]" real "" 100 0 100
  12. ;control noise-vl "Amplitude of white noise [percent]" real "" 0 0 100
  13. ;control radar-vl "Amplitude of Radar Needles [percent]" real "" 0 0 100
  14. ;control radar-f "Frequency of Radar Needles [Hz]" real "" 30 1 100
  15.  
  16. ; vocoder by Edgar-RFT
  17. ; a bit of code added by David R. Sky
  18. ; Released under terms of the GNU Public License version 2
  19. ; http://www.opensource.org/licenses/gpl-license.php
  20.  
  21. ; maybe the code once again has to be changed into _one_ local let-binding
  22. ; if you have lots of nyquist "[gc:" messages try this:
  23. ; (expand 100) ; gives Xlisp more memory but I have noticed no speed difference
  24.  
  25. ; number of octaves between 20hz and 20khz
  26. (setf octaves (/ (log 1000.0) (log 2.0)))
  27.  
  28. ; convert octaves to number of steps (semitones)
  29. (setf steps (* octaves 12.0))
  30.  
  31. ; interval - number of steps per vocoder band
  32. (setf interval (/ steps bands))
  33.  
  34. ; Some useful calculations but not used in this plugin
  35.  
  36. ; half tone distance in linear
  37. ; (print (exp (/ (log 2.0) 12)))
  38.  
  39. ; octave distance in linear
  40. ; (print (exp (/ (log 1000.0) 40)))
  41.  
  42. ; The Radar Wavetable
  43.  
  44. ; make *radar-table* a global variable.
  45. (setf contol-dummy *control-srate*)   ; save old *control-srate*
  46. (set-control-srate *sound-srate*)  
  47. (setf *radar-table* (pwl (/ 1.0 *control-srate*) 1.0  ; 1.0 after 1 sample
  48.                          (/ 2.0 *control-srate*) 0.0  ; 0.0 after 2 samples
  49.                          (/ 1.0 radar-f))) ; stay 0.0 until end of the period
  50. (set-control-srate contol-dummy)      ; restore *control-srate*
  51. ; make *radar-table* become a nyquist wavetable of frequency radar-f
  52. (setf *radar-table* (list *radar-table* (hz-to-step radar-f) T))
  53.  
  54. ; increase the volume of the audacity track in the middle of the slider
  55. ; the sqrt trick is something like an artifical db scaling
  56. (setf track-vol (sqrt (/ track-vl 100.0)))
  57. ; decrease the volume of the white noise in the middle of the slider
  58. ; the expt trick is an inverse db scaling
  59. (setf noise-vol (expt (/ noise-vl 100.0) 2.0))
  60. ; also increase the volume of the needles in the middle of the slider
  61. (setf radar-vol (sqrt (/ radar-vl 100.0)))
  62.  
  63. ; here you can switch the tracks on and off for bug tracking
  64.  
  65. ;  (setf radar-vol 0)
  66. ;  (setf noise-vol 0)
  67. ;  (setf track-vol 0)
  68.  
  69. ; The Mixer
  70.  
  71. ; calculate duration of audacity selection
  72. (setf duration (/ len *sound-srate*))
  73.  
  74. ; if track volume slider is less than 100 percent decrease track volume
  75. (if (< track-vl 100) (setf s (vector (aref s 0) (scale track-vol (aref s 1)))))
  76.  
  77. ; if radar volume slider is more than 0 percent add some radar needles
  78. (if (> radar-vl 0) (setf s (vector (aref s 0) (sim (aref s 1)
  79.   (scale radar-vol (osc (hz-to-step radar-f) duration *radar-table*))))))
  80.  
  81. ; if noise volume slider is more than 0 percent add some white noise
  82. (if (> noise-vl 0) (setf s (vector (aref s 0) (sim (aref s 1)
  83.   (scale noise-vol (noise duration))))))
  84.  
  85. ; The Vocoder
  86.  
  87. (defun vocoder ()
  88.   (let ((p (+ (hz-to-step 20) (/ interval 2.0))) ; midi step of 20 Hz + offset
  89.          f   ; we can leave f initialized to NIL
  90.         (q (/ (sqrt 2.0) (/ octaves bands))) ; explanation still missing
  91.         (result 0)) ; must be initialized to 0 because you cannot sum to NIL
  92.     (dotimes (i bands)
  93.       (setf f (step-to-hz p))
  94.       (setf result (sum result
  95.                    (bandpass2 (mult (lowpass8
  96.             (s-max (bandpass2 (aref s 0) f q)
  97.          (scale -1 (bandpass2 (aref s 0) f q))) (/ f dst))
  98.                    (bandpass2 (aref s 1) f q)) f q)))
  99.       (setf p (+ p interval)))
  100.     result))
  101.  
  102. ; The Program
  103.  
  104. (if (arrayp s) (let ()
  105.   (cond ((= mst 1) (vector (aref s 0) (setf (aref s 1) (vocoder))))
  106.         ((= mst 0) (setf s (vocoder))))
  107.   (cond ((= mst 1) (setq peakamp (peak (aref s 1) ny:all)))
  108.         ((= mst 0) (setq peakamp (peak s ny:all))))
  109.   (cond ((= mst 1) (vector (aref s 0) (setf (aref s 1)
  110.                                         (scale (/ 1.0 peakamp) (aref s 1)))))
  111.         ((= mst 0) (setf s (scale (/ 1.0 peakamp) s))))
  112. s))
  113.  
  114.